1、正则表达式
思想：动态规划
初始化：将v[0][0]=true；然后初始化第一行，也就是判断是否有*，如果有*就代表时true，
分情况：
当p[j]为*时，这时候分3中情况
第一种：*前面的字符一次都不出现，即v[i-1][j-1]为真时v[i][j]为真。
第二种：*前面的字符出现一次，即v[i-1][j]&&s[i]==p[j-1]时为真
第三种：p[j-1]为*并且v[i-1][j]为真
当p[j]不为*时，分2中情况
第一种：当v[i-1][j-1]&&s[i]==p[j]时为真。
第二种：当v[i-1][j-1]&&p[j]=='.'时为真
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    bool match(string str, string pattern) {
        // write code here
        vector<vector<bool>> v(str.size()+1,vector<bool>(pattern.size()+1,false));
        v[0][0]=true;
        //初始化首行
        for(int j=2;j<=pattern.size();j+=2)
        {
            v[0][j]=v[0][j-2]&&pattern[j-1]=='*';
        }
        for(int i=1;i<=str.size();i++)
        {
            for(int j=1;j<=pattern.size();j++)
            {
                if(pattern[j-1]=='*')
                {
                    if(v[i][j-2])
                        v[i][j]=true;
                    else if(v[i-1][j]&&str[i-1]==pattern[j-2])
                    {
                        v[i][j]=true;
                    }
                    else if(v[i-1][j]&&pattern[j-2]=='.')
                    {
                        v[i][j]=true;
                    }
                }
                else
                {
                    if(v[i-1][j-1]&&str[i-1]==pattern[j-1])
                         v[i][j]=true;
                    else if(v[i-1][j-1]&&pattern[j-1]=='.')
                    {
                        v[i][j]=true;
                    }
                }
            }
            
        }
        return v[str.size()][pattern.size()];
    }
};

2、字符流中的第一个出现的字符串
思想：利用队列和map，将每个第一次出现的字符放到队列里面并且统计次数，然后遍历队列里面的，当队头元素在map统计次数中只出现一次，那么就是第一个出现的
class Solution
{
public:
    queue<char> q;
    unordered_map<char,int> m;
  //Insert one char from stringstream
    void Insert(char ch) {
        //将每个第一次出现的字符放到队列里面
         if(m.find(ch)==m.end())
             q.push(ch);
        m[ch]++;//统计每个字符次数
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce() {
        while(!q.empty())
        {
            char ch=q.front();
            if(m[ch]==1)
                return ch;
            else
                q.pop();
        }
        return '#';
    }

};